
import { ServerError } from "..";

/** 
 * 保存文件
 */
export async function saveFile(data: Response, options?: ISaveFileOptions) {
    if (options?.isSaveFile === true && data.ok) {
        try {
            const { filename } = options;
            const blob = await data.blob();
            const req = await isJson(blob);
            if (req) {
                throw new ServerError(req.status.description|| req.message || '下载文件失败', req);
            } else {
                const blobUrl = window.URL.createObjectURL(blob);
                const link = document.createElement('a');
                link.href = blobUrl;

                link.download = filename || decodeURIComponent(data.headers.get('content-disposition')?.substring(20) || "") || '我的文件';
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);
            }
        } catch (error) {
            throw error instanceof ServerError ? error : new ServerError('下载文件失败', error);
        }
    }
    return data;
}

export interface ISaveFileOptions {

    /** 文件名字 */
    filename?: string

    /** 
     * 是否保存文件
     */
    isSaveFile?: boolean
}

async function isJson(blob: Blob): Promise<any> {
    try {
        // 将 blob 转换为字符串
        const text = await blob.text();

        // 尝试将字符串解析为 JSON
        JSON.parse(text);

        // 如果没有抛出错误，那么这个 blob 可以被解析为 JSON
        return JSON.parse(text);
    } catch (error) {
        // 如果抛出了错误，那么这个 blob 不能被解析为 JSON
        return false;
    }
}